SPDX-FileCopyrightText: 2022 Elias Chabbi & Etienne Poinas SPDX-FileCopyrightText: 2024 AlICe laboratory https://alicelab.be
SPDX-License-Identifier: GPL-3.0-or-later
Ianis Xenakis: Achorripsis
import bpy
import random
import mathdef clean():
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.outliner.orphans_purge()
clean()import bpy
import numpy as npdef make_poisson(lam1, lam2, lam3):how many cubes you want to add
count = 10wrap next part in a loop to generate more than 1 sample
Tabbivariate1 = []
Tabbivariate2 = []
for i in range(100):
a = np.random.poisson(lam1)
b = np.random.poisson(lam2)
c = np.random.poisson(lam3)
Tabbivariate1.append(a + c) # follows Poi(lam1+lam3)
Tabbivariate2.append(b + c) # follows Poi(lam2+lam3)Tableaux
Tabbivariate1 = np.array(Tabbivariate1) # elements
Tabbivariate2 = np.array(Tabbivariate2) # elements
hist, xedges, yedges = np.histogram2d(
Tabbivariate1, Tabbivariate2, bins=10, range=[[0, 10], [0, 10]]
)
xpos, ypos = np.meshgrid(xedges[:-1] + 0.25, yedges[:-1] + 0.25, indexing="ij")
xpos = xpos.ravel()
ypos = ypos.ravel()
zpos = 0Construct arrays with the dimensions for the 100 bars.
dx = dy = 0.8 * np.ones_like(zpos)
dz = hist.ravel()
dz = dz.reshape((10, 10))
dz = dz / 6 # To have them smaller in depth
return dz
dz = make_poisson(1.3, 0.6, 2.2)
count = 10bpy.ops.mesh.primitive_grid_add(
enter_editmode=False, align="WORLD", location=(4.5, 4.5, 0.15), scale=(1, 1, 1)
)
glissandi = bpy.data.objects["Grid"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 5, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")Percussions = bpy.data.collections.new("Percussions")
for c in range(0, count):
for d in range(0, count):
x = c
y = d
z = 9
if dz[c][d] > 0:
bpy.ops.mesh.primitive_uv_sphere_add(
radius=d / (c + 1),
enter_editmode=False,
align="WORLD",
location=(x, y, 1.666 + dz[c][d]),
scale=(1, 1, 1),
)
bpy.ops.object.shade_smooth()for c in range(0, count):
for d in range(0, count):
x = c
y = d
z = 9
if dz[c][d] > 0:
bpy.ops.mesh.primitive_cone_add(
radius1=0.6 + (dz[c][d] / 1.2),
radius2=0,
depth=(dz[c][d]),
enter_editmode=True,
location=(x, y, 3.333 - dz[c][d] / 2),
rotation=(0, math.pi, 0),
scale=(0.6, 0.6, dz[c][d] / 4),
)subdivise
bpy.ops.mesh.subdivide(
number_cuts=20, smoothness=0, fractal=0, fractal_along_normal=0
)sharp
bpy.context.scene.tool_settings.use_proportional_edit = True
bpy.context.scene.tool_settings.proportional_edit_falloff = "SHARP"
bpy.ops.object.editmode_toggle()
bpy.ops.object.modifier_add(type="WAVE")
bpy.context.object.modifiers["Wave"].falloff_radius = 2
bpy.context.object.modifiers["Wave"].height = 2 + dz[c][d] * 3
bpy.context.object.modifiers["Wave"].width = 100
bpy.ops.object.modifier_apply(modifier="Wave")dz = make_poisson(1, 2, 3)grille #
bpy.ops.mesh.primitive_grid_add(
x_subdivisions=10,
y_subdivisions=4,
enter_editmode=False,
align="WORLD",
location=(4.5, 4.5, 5),
scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.001"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(3, 0.3, 3)grille #
bpy.ops.mesh.primitive_grid_add(
x_subdivisions=10,
y_subdivisions=4,
enter_editmode=False,
align="WORLD",
location=(4.5, 6.5, 5),
rotation=(0, math.pi, 0),
scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.002"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(0.7, 0.2, 7.2)grille #
bpy.ops.mesh.primitive_grid_add(
x_subdivisions=5,
y_subdivisions=8,
enter_editmode=False,
align="WORLD",
location=(4.5, 8.5, 5),
scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.003"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(1.8, 0.9, 2.9)Grille #
bpy.ops.mesh.primitive_grid_add(
x_subdivisions=5,
y_subdivisions=10,
enter_editmode=False,
align="WORLD",
location=(4.5, 2.5, 5),
rotation=(0, math.pi, 0),
scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.004"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(0.6, 1, 3)Grille #
bpy.ops.mesh.primitive_grid_add(
x_subdivisions=7,
y_subdivisions=4,
enter_editmode=False,
align="WORLD",
location=(4.5, 0.5, 5),
scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.005"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")for c in range(0, count):
for d in range(0, count):
x = c
y = d
z = 9
if dz[c][d] > 0: bpy.ops.curve.spirals(
spiral_type="ARCH",
turns=2,
steps=22,
edit_mode=False,
radius=0.1,
dif_radius=0.5,
dif_z=(dz[c][d]) * 10,
startlocation=(x, y, 6.666 - dz[c][d] * 13),
rotation_euler=(0, 0, 0),
)
curve_object = bpy.data.objects["Spiral"]
bpy.context.object.data.offset = 0.15
bpy.context.object.data.extrude = 0.15 bpy.data.objects["Spiral"].select_set(True)
bpy.ops.object.convert(target="MESH")
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = (dz[c][d]) / 2.2
bpy.context.object.modifiers["Solidify"].offset = (dz[c][d]) / 6
bpy.ops.object.modifier_apply(modifier="Solidify")for c in range(0, count):
for d in range(0, count):
x = c
y = d
z = 9
if dz[c][d] > 0:
bpy.ops.mesh.primitive_uv_sphere_add(
segments=50,
ring_count=30,
enter_editmode=False,
location=(x, y, 8.333 - dz[c][d] * 3),
rotation=(0, 0, d),
scale=(0.5, 0.5, 1),
) bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.context.object.modifiers["Subdivision"].render_levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision") bpy.ops.object.modifier_add(type="WAVE")
bpy.context.object.modifiers["Wave"].use_x = False
bpy.context.object.modifiers["Wave"].falloff_radius = 0
bpy.context.object.modifiers["Wave"].height = 1
bpy.context.object.modifiers["Wave"].width = 4
bpy.context.object.modifiers["Wave"].narrowness = 4
bpy.ops.object.modifier_apply(modifier="Wave")loi de poisson #
dz = make_poisson(1.6, 1.1, 0.5)grille #
bpy.ops.mesh.primitive_grid_add(
enter_editmode=False, align="WORLD", location=(4.3, 4.5, 9.85), scale=(1, 1, 1)
)
glissandi = bpy.data.objects["Grid.006"].data
vals = []
for line in dz:
for v in line:
vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
point.co.z = z_val
bpy.ops.transform.resize(value=(5, 5, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")
bpy.ops.transform.rotate(
value=3.14159,
orient_axis="X",
orient_type="GLOBAL",
orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)),
constraint_axis=(True, False, False),
proportional_size=1,
)